package com.explorati.design_pattern.creational.singleton;

import java.io.Serializable;

/**
 * 饿汉式单例模式 这种方法在类加载时就完成赋值了，若未使用到这个对象，则浪费内存，并对性能造成影响 资源浪费少的时候可以使用，比较简单
 * 
 * @author explorati
 *
 */
// 饿汉和懒汉的区别就是在类加载的时候就完成初始化，还是在类调用的时候完成
public class HungrySingleton implements Serializable, Cloneable {

	// 在类加载时就初始化
	private static final HungrySingleton hungrySingleton;

	// 静态代码块实现，和在属性中直接new一样
	static {
		// 在类加载时就初始化
		hungrySingleton = new HungrySingleton();
	}

	// 防止反射攻击
	private HungrySingleton() {
		// 对于这种单例模式(类加载时就把对象创建好了)可以使用这种方式防止反射攻击
		if (hungrySingleton != null) {
			throw new IllegalArgumentException("单例构造器禁止反射调用");
		}
	}

	public static HungrySingleton getInstance() {
		return hungrySingleton;
	}

	/**
	 * 通过解读ObjectInputStream以及相关源码来解决序列化破坏单例
	 * 
	 * @return
	 */
	private Object readResolve() {
		return hungrySingleton;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return getInstance();
	}

}
